---
title: .moon/tasks[/**/*].{pkl,yml}
---

import HeadingApiLink from '@site/src/components/Docs/HeadingApiLink';
import VersionLabel from '@site/src/components/Docs/VersionLabel';

The `.moon/tasks.yml` file configures file groups and tasks that are inherited by _every_ project in
the workspace, while `.moon/tasks/**/*.yml` configures for projects based on their language or type.
[Learn more about task inheritance!](../concepts/task-inheritance)

Projects can override or merge with these settings within their respective [`moon.yml`](./project).

```yaml title=".moon/tasks.yml"
$schema: 'https://moonrepo.dev/schemas/tasks.json'
```

:::info

Inherited tasks configuration can also be written in [Pkl](../guides/pkl-config) instead of YAML.

:::

## `extends`

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#extends" />

Defines one or many external `.moon/tasks.yml`'s to extend and inherit settings from. Perfect for
reusability and sharing configuration across repositories and projects. When defined, this setting
must be an HTTPS URL _or_ relative file system path that points to a valid YAML document!

```yaml title=".moon/tasks.yml" {1}
extends: 'https://raw.githubusercontent.com/organization/repository/master/.moon/tasks.yml'
```

:::caution

For map-based settings, `fileGroups` and `tasks`, entries from both the extended configuration and
local configuration are merged into a new map, with the values of the local taking precedence. Map
values _are not_ deep merged!

:::

## `fileGroups`

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#fileGroups" />

> For more information on file group configuration, refer to the
> [`fileGroups`](./project#filegroups) section in the [`moon.yml`](./project) doc.

Defines [file groups](../concepts/file-group) that will be inherited by projects, and also enables
enforcement of organizational patterns and file locations. For example, encourage projects to place
source files in a `src` folder, and all test files in `tests`.

```yaml title=".moon/tasks.yml"
fileGroups:
  configs:
    - '*.config.{js,cjs,mjs}'
    - '*.json'
  sources:
    - 'src/**/*'
    - 'types/**/*'
  tests:
    - 'tests/**/*'
    - '**/__tests__/**/*'
  assets:
    - 'assets/**/*'
    - 'images/**/*'
    - 'static/**/*'
    - '**/*.{scss,css}'
```

:::info

File paths and globs used within a file group are relative from the inherited project's root, and
not the workspace root.

:::

## `implicitDeps`

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#implicitDeps" />

Defines task [`deps`](./project#deps) that are implicitly inserted into _all_ inherited tasks within
a project. This is extremely useful for pre-building projects that are used extensively throughout
the repo, or always building project dependencies. Defaults to an empty list.

```yaml title=".moon/tasks.yml" {1-2}
implicitDeps:
  - '^:build'
```

:::info

Implicit dependencies are _always_ inherited, regardless of the [`mergeDeps`](./project#mergedeps)
option.

:::

## `implicitInputs`

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#implicitInputs" />

Defines task [`inputs`](./project#inputs) that are implicitly inserted into _all_ inherited tasks
within a project. This is extremely useful for the "changes to these files should always trigger a
task" scenario.

Like `inputs`, file paths/globs defined here are relative from the inheriting project.
[Project and workspace relative file patterns](../concepts/file-pattern#project-relative) are
supported and encouraged.

```yaml title=".moon/tasks/node.yml" {1-2}
implicitInputs:
  - 'package.json'
```

:::info

Implicit inputs are _always_ inherited, regardless of the [`mergeInputs`](./project#mergeinputs)
option.

:::

## `tasks`

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#tasks" />

> For more information on task configuration, refer to the [`tasks`](./project#tasks) section in the
> [`moon.yml`](./project) doc.

As mentioned in the link above, [tasks](../concepts/task) are actions that are ran within the
context of a project, and commonly wrap a command. For most workspaces, every project _should_ have
linting, typechecking, testing, code formatting, so on and so forth. To reduce the amount of
boilerplate that _every_ project would require, this setting offers the ability to define tasks that
are inherited by many projects within the workspace, but can also be overridden per project.

```yaml title=".moon/tasks.yml"
tasks:
  format:
    command: 'prettier --check .'

  lint:
    command: 'eslint --no-error-on-unmatched-pattern .'

  test:
    command: 'jest --passWithNoTests'

  typecheck:
    command: 'tsc --build'
```

:::info

Relative file paths and globs used within a task are relative from the inherited project's root, and
not the workspace root.

:::

## `taskOptions`<VersionLabel version="1.20.0" />

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#taskOptions" />

> For more information on task options, refer to the [`options`](./project#options) section in the
> [`moon.yml`](./project) doc.

Like [tasks](#tasks), this setting allows you to define task options that will be inherited by _all
tasks_ within the configured file, and by all project-level inherited tasks. This setting is the 1st
link in the inheritance chain, and can be overridden within each task.

```yaml title=".moon/tasks.yml"
taskOptions:
  # Never cache builds
  cache: false
  # Always re-run flaky tests
  retryCount: 2

tasks:
  build:
    # ...
    options:
      # Override the default cache setting
      cache: true
```
